/**
 * UFCG - CEEI - DSC- SI1
 * Projeto da Disciplina Sistema de Informacao 1 - 2011.1
 * 
 * Professor: Hyggo Almeida
 * 
 * Alunos: Felipe de Sousa - felipeso@lcc.ufcg.edu.br
 * 		   Matheus Sampaio - matheusss@lcc.ufcg.edu.br
 *         Henrique Florencio - henriquecf@lcc.ufcg.edu.br
 *         Claudio Cardoso - claudiocaj@lcc.ufcg.edu.br
 * 		   Julio Henrrique - juliohr@lcc.ufcg.edu.br
 * 
 */
package model;

import java.io.Serializable;

import exception.ExceptionTipoInvalido;

public class Laboratorios implements SalaIF, Serializable {

	private static final long serialVersionUID = -582654289627203248L;
	private String apelido;
	private int capacidade;
	private String finalidade;
	private String id;
	private TiposDeLaboratorioIF tipo;
	private boolean aberto;

	/**
	 * Laboratorio sem parametro "apelido"
	 * 
	 * @param id
	 *            uma string para o identificador do objeto
	 * @param capacidade
	 *            um inteiro para representar a capacidade
	 * @param finalidade
	 *            uma string que representa a finalidade do laboratorio
	 * @param tipo
	 *            uma string que representa o tipo do laboratorio
	 * 
	 * @param apelido
	 *            uma string que representa o apeido do laboratorio
	 * @throws ExceptionTipoInvalido
	 */
	public Laboratorios(String id, int capacidade, String finalidade,
			String tipo, String apelido) throws ExceptionTipoInvalido {
		this(id, capacidade, finalidade, tipo, apelido, false);
	}

	/**
	 * Laboratorio sem parametro "apelido"
	 * 
	 * @param id
	 *            uma string para o identificador do objeto
	 * @param capacidade
	 *            um inteiro para representar a capacidade
	 * @param finalidade
	 *            uma string que representa a finalidade do laboratorio
	 * @param tipo
	 *            uma string que representa o tipo do laboratorio
	 * @throws ExceptionTipoInvalido
	 */
	public Laboratorios(String id, int capacidade, String finalidade,
			String tipo) throws ExceptionTipoInvalido {
		this(id, capacidade, finalidade, tipo, "", false);
	}

	/**
	 * Laboratorio com "apelido" e "aberto"
	 * 
	 * @param id
	 *            uma string para o identificador do objeto
	 * @param capacidade
	 *            um inteiro para representar a capacidade
	 * @param finalidade
	 *            uma string que representa a finalidade da sala
	 * @param tipo
	 *            uma string que representa o tipo da sala
	 * @param apelido
	 *            uma string que representa o apelido da sala
	 * @throws ExceptionTipoInvalido
	 */
	public Laboratorios(String id, int capacidade, String finalidade,
			String tipo, String apelido, boolean aberto)
			throws ExceptionTipoInvalido {
		this.id = id;
		this.capacidade = capacidade;
		this.finalidade = finalidade;
		this.tipo = criaTipo(tipo);
		this.apelido = apelido;
		this.aberto = aberto;
	}

	/**
	 * Factory Method para criar os tipos de laboratorios
	 * 
	 * @param tipo
	 *            uma string com o nome do tipo
	 * @return um objeto do tipo TiposDeLaboratorioIF
	 * @throws ExceptionTipoInvalido
	 *             caso o tipo passado como parametro nao exista
	 */
	private TiposDeLaboratorioIF criaTipo(String tipo)
			throws ExceptionTipoInvalido {
		if (tipo.equalsIgnoreCase("Computacao")) {
			return new LaboratorioTipoComputacao();
		} else if (tipo.equalsIgnoreCase("Biologia")) {
			return new LaboratorioTipoBiologia();
		} else if (tipo.equalsIgnoreCase("Quimica")) {
			return new LaboratorioTipoQuimica();
		} else if (tipo.equalsIgnoreCase("Fisica")) {
			return new LaboratorioTipoFisica();
		} else {
			throw new ExceptionTipoInvalido();
		}

	}

	@Override
	public String getApelido() {
		return apelido;
	}

	@Override
	public String getAtributos(String atributo) {
		if (atributo.equals("id")) {
			return getId();
		} else if (atributo.equals("capacidade")) {
			return Integer.toString(getCapacidade());
		} else if (atributo.equals("finalidade")) {
			return getFinalidade();
		} else if (atributo.equals("tipo")) {
			return getTipo();
		} else if (atributo.equals("apelido")) {
			return getApelido();
		} else {
			return "Atributo nao encontrado";
		}
	}

	@Override
	public int getCapacidade() {
		return this.capacidade;
	}

	@Override
	public String getFinalidade() {
		return this.finalidade;
	}

	@Override
	public String getId() {
		return this.id;
	}

	@Override
	public String getTipo() {
		return tipo.getTipo();
	}

	@Override
	public void setApelido(String apelido) {
		this.apelido = apelido;
	}

	@Override
	public void setCapacidade(int novaCapacidade) {
		this.capacidade = novaCapacidade;
	}

	public void setAberto(boolean aberto) {
		this.aberto = aberto;
	}

	public boolean isAberto() {
		return aberto;
	}

}
